//bijgewerkt
#include <p24FJ32GA002.h>
#include <stdio.h>
/*
 * Shift Register, afkorting: SR
 */

// TRIS
#define SR_STROBE_TRIS 		TRISBbits.TRISB13

// LAT
#define SR_STROBE			LATBbits.LATB13

// DataSR om data te bewaren voor verschillende handelingen
unsigned int DataSR;

void InitSPI(void)
{
  SR_STROBE_TRIS = 0; // STROBE, make output
  SR_STROBE = 0; // Init outputs pins

  // Assign functions to pins
  RPOR7bits.RP14R = 10; // SDO2
  RPOR7bits.RP15R = 11; // SCK2OUT

  // Schone lijn
  SPI2STAT = 0;
  IFS2bits.SPI2IF = 0;
  // 101 = Interrupt when the last bit is shifted out of SPIxSR, now the transmit is complete
  //SPI2STATbits.SISEL = 0b101; 

  SPI2CON1bits.MSTEN = 1; // 1 = Master mode
  // CKE: SPIx Clock Edge Select bit(1)
  SPI2CON1bits.CKE = 1; //1 = Serial output data changes on transition from active clock state to Idle clock state (see bit 6)

  // Interrupt uitgeschakeld
  IEC2bits.SPI2IE = 0;

  SPI2CON2bits.SPIBEN = 1; // enhanched buffer SPI 
  
  // Enable SPI
  SPI2STATbits.SPIEN = 1;

}

unsigned int SRPut(unsigned Data) // SPI2Put
{
    // Wait for a data byte reception
    while(SPI2STATbits.SPITBF);
    SPI2BUF = Data;
	// Bewaar data voor andere handelingen
	DataSR = Data;
    return 0;
}

void WritePin(int pin, int value)
{
  // Pin nummer 0-7
  // (1 << pin) Er wordt geshift zodat -> 7 = 0b10000000 = 128
  // Stel DataSR = 0b00000001
  // Met OR wordt het 0b10000001
  // Zo wordt de oude waarde niet overschreven, maar alleen de pin wordt geupdate
  WriteSR(DataSR | (value << pin));
}

void WriteSR(unsigned Data) 
{

  // STORBE moet laag zijn voor inlezen data
  SR_STROBE = 0;
  // Schrijf data weg via SPI, Clock wordt geregelt door SPI registers
  SRPut(Data);
  // STORBE hoog maken, zodat data doorschuift naar output. 
while(!SPI2STATbits.SRMPT);
Delay();
  SR_STROBE = 1;

}
